/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.english.pojj.adv_framework.game_gui;

import java.util.EnumMap;
import java.util.Map;



/*******************************************************************************
 * Instance třídy {@code Commands} přestavují přepravky uchovávající
 * názvy základních příkazů v dané hře.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   5.0
 */
public class Commands
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Název příkazu pro přesun z místnosti do místnosti. */
    public final String cMOVE;

    /** Název příkazu pro položení předmětu. */
    public final String cPUT_DOWN;

    /** Název příkazu pro zvednutí předmětu. */
    public final String cPICK_UP;

    /** Název příkazu pro ukončení hry. */
    public final String cEND;

    /** Mapa umožňující získání příkazu zadáním názvu jeho typu. */
    Map<Type, String> type2name = new EnumMap<Type, String>(Type.class);



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Podpis instance generovaný metodou toString() -
     *  vytváří se až při prvním požadavku. */
    private String toString;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří přepravku uchovávající názvy příkazů pro činnosti,
     * které musí být implementovány ve všech hrách.
     *
     * @param move     Název příkazu pro přesun z místnosti do místnosti
     * @param putDown  Název příkazu pro položení předmětu
     * @param pickUp   Název příkazu pro zvednutí předmětu
     * @param end      Název příkazu pro ukončení hry
     */
    public Commands(String move, String putDown, String pickUp, String end)
    {
        this.cMOVE     = move;
        this.cPUT_DOWN = putDown;
        this.cPICK_UP  = pickUp;
        this.cEND      = end;

        type2name.put(Type.MOVE,     move);
        type2name.put(Type.PUT_DOWN, putDown);
        type2name.put(Type.PICK_UP,  pickUp);
        type2name.put(Type.END,      end);
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí název příkazu zadaného typu;
     *
     * @param typeOfCommand Typ příkazu, jehož název zjišťujeme
     * @return Název příkazu zadaného typu
     */
    public String getCommandName(Type typeOfCommand)
    {
        return type2name.get(typeOfCommand);
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Vrací podpis instance sestávající z názvu třídy následovaného
     * výčtem hodnot atributů uzavřeným v hranatých závorkách.
     *
     * @return Podpis instance
     */
    @Override
    public String toString()
    {
        if (toString == null) {
            toString = "BasicCommands[MOVE=" + cMOVE + ", PUT=" + cPUT_DOWN +
                       ", PICK=" + cPICK_UP + ", END=" + cEND + "]";
        }
        return toString;
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================

    /** Názvy typů příkazů. */
    public static enum Type{ MOVE, PUT_DOWN, PICK_UP, END; }



//== TESTY A METODA MAIN =======================================================
}
